package org.lanqiao.Db;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;

/**
 * 该方法实现对数据库中数据的操作：查询、插入、删除
 * 
 * @author loveli
 *
 */
public class DbDriver {

	/**
	 * @param strSql
	 *            查询语句
	 * @param rsh
	 *            泛型的类
	 * @return 泛型的集合
	 */
	public <T> T query(String strSql, ResultSetHandler<T> rsh) {
		// 创建一个List集合来装数据
		T lis = null;
		try {
			// 在dbutils工具中，使用queryrunner进行数据查询操作
			QueryRunner qr = new QueryRunner(DBDataSource.getDataSource(),true);
			lis = qr.query(strSql, rsh);
		} catch (SQLException e) {
			// 异常处理
			System.out.println("把数据存储在List中错误：" + e.getMessage());
		}
		return lis;
	}

	/**
	 * @param strSql
	 *            查询语句
	 * @param rsh
	 *            传入的泛型
	 * @param params
	 *            可变长的参数
	 * @return 返回一个泛型的集合
	 */
	public <T> T query(String strSql, ResultSetHandler<T> rsh, Object... params) {
		// 创建一个List集合来装数据
		T lis = null;
		try {
			// 在dbutils工具中，使用queryrunner进行数据查询操作
			QueryRunner qr = new QueryRunner(DBDataSource.getDataSource(),true);
			lis = qr.query(strSql, rsh, params);
		} catch (SQLException e) {
			// 异常处理
			System.out.println("把数据存储在List中错误：" + e.getMessage());
		}
		return lis;
	}

	/**
	 * @param strSql
	 *            更新语句
	 * @param params
	 *            可变长的参数
	 * @return 返回的数确定更新是否成功：大于0是更新成功
	 */
	public int update(String strSql, Object... params) {
		// 创建一个List集合来装数据
		int reflag = 0;
		try {
			// 在dbutils工具中，使用queryrunner进行数据查询操作
			QueryRunner qr = new QueryRunner(DBDataSource.getDataSource(),true);
			reflag = qr.update(strSql, params);
		} catch (SQLException e) {
			// 异常处理
			e.printStackTrace();
//			System.out.println("把数据更新后存储在int中错误：" + e.getMessage());
		}
		return reflag;
	}

	/**
	 * @param strSql
	 *            删除语句
	 * @param params
	 *            可变长参数
	 * @return 返回一个int型的整数
	 */
	public int delete(String strSql, Object... params) {
		// 创建一个List集合来装数据
		int flag = 0;
		try {
			// 在dbutils工具中，使用queryrunner进行数据查询操作
			QueryRunner qr = new QueryRunner(DBDataSource.getDataSource(),true);
			flag = qr.update(strSql, params);
		} catch (SQLException e) {
			// 异常处理
			System.out.println("把数据删除后用int表示错误：" + e.getMessage());
		}
		return flag;
	}

	/**
	 * @param strSql
	 *            处理语句
	 * @param params
	 *            批数据
	 * @return
	 */
	public int[] batch(String strSql, Object[][] params) {
		// 创建一个List集合来装数据
		int[] flag = null;
		try {
			// 在dbutils工具中，使用queryrunner进行数据查询操作
			QueryRunner qr = new QueryRunner(DBDataSource.getDataSource(),true);
			flag = qr.batch(strSql, params);
		} catch (SQLException e) {
			// 异常处理
			System.out.println("把批数据执行时错误：" + e.getMessage());
		}
		return flag;
	}

}
